#include <iostream>
#include <string>
#include <memory>
#include "HttpServer.hpp"
#include "Util.hpp"

using namespace std;

// V5版本，状态码、重定向、Cookie 缓存
std::string HttpHandler(std::string msg)
{
    // 1、读取请求
    cout << "<===================================>" << endl;
    cout << msg << endl;

    // // 2、反序列化（请求行、请求报头）
    // Util::HttpStruct hs = Util::Deserialize(msg);

    // // 3、正文部分（额外读取）
    // string body;
    // bool ret = Util::ReadFile(hs.path_, body);

    // // 4、这里直接返回 html 文件
    // std::string response;

    // if (ret)
    // {
    //     response = ("HTTP/1.0 200 OK" + SEP);
    //     response += "Connect-Type: " + Util::GetType(hs.suffix_) + SEP;
    // }
    // else
    // {
    //     response = ("HTTP/1.0 404 Not Found" + SEP);
    //     response += "Connect-Type: " + defaultSuffix + SEP;
    // }

    // response += "Connect-Length: " + to_string(body.size()) + SEP;
    // response += SEP;

    // response += body;
    // cout << response << endl;

    // // 重定向
    // std::string response = "HTTP/1.0 301 Moved Permanently" + SEP;
    // response += "Location: https://blog.csdn.net/weixin_61437787?spm=1000.2115.3001.5343" + SEP; // 重定向至其他网站
    // response += SEP;

    // cout << response << endl;

    // Cookie 缓存
    Util::HttpStruct hs = Util::Deserialize(msg);

    std::string response = "HTTP/1.0 200 OK" + SEP;
    response += "Set-Cookie: sessionid=gy668" + SEP;
    string body;
    Util::ReadFile(defaultPath, body);
    response += SEP;
    response += body;

    // 5、返回
    return response;
}

// //V4版本，站内跳转、发送表单，不同的请求方法（GET/POST）
// std::string HttpHandler(std::string msg)
// {
//     //1、读取请求
//     cout << "<===================================>" << endl;
//     cout << msg << endl;

//     //2、反序列化（请求行、请求报头）
//     Util::HttpStruct hs = Util::Deserialize(msg);

//     //3、正文部分（额外读取）
//     string body = Util::ReadFile(hs.path_);

//     //4、这里直接返回 html 文件
//     std::string response = ("HTTP/1.0" + SEP);
//     response += "Connect-Length: " + to_string(body.size()) + SEP;
//     response += "Connect-Type: " + Util::GetType(hs.suffix_) + SEP;
//     response += SEP;

//     response += body;

//     cout << response << endl;

//     //5、返回
//     return response;
// }

// //V3版本，根据不同的请求，发出不同的响应（附带图片）
// std::string HttpHandler(std::string msg)
// {
//     //1、读取请求
//     cout << "<===================================>" << endl;
//     cout << msg << endl;

//     //2、反序列化（请求行、请求报头）
//     Util::HttpStruct hs = Util::Deserialize(msg);

//     //3、正文部分（额外读取）
//     string body = Util::ReadFile(hs.path_);

//     //4、这里直接返回 html 文件
//     std::string response = ("HTTP/1.0" + SEP);
//     response += "Connect-Length: " + to_string(body.size()) + SEP;
//     response += "Connect-Type: " + Util::GetType(hs.suffix_) + SEP;
//     response += SEP;

//     response += body;

//     cout << response << endl;

//     //5、返回
//     return response;
// }

// //V2版本，回响网页
// std::string HttpHandler(std::string msg)
// {
//     //1、读取请求
//     cout << "<===================================>" << endl;
//     cout << msg << endl;

//     //2、反序列化
//     Util::HttpStruct hs = Util::Deserialize(msg);

//     //3、正文部分（额外读取）
//     string body = Util::ReadFile();

//     //4、这里直接返回 html 文件
//     std::string response = ("HTTP/1.0" + SEP);
//     response += "Connect-Length: " + to_string(body.size()) + SEP;
//     response += "Connect-Type: text/html" + SEP;
//     response += SEP;

//     response += body;

//     cout << response << endl;

//     std::cout << "测试: " << response << std::endl;

//     //5、返回
//     return response;
// }

// //V1版本，直接回响 请求行、请求报头、空行、有效载荷
// std::string HttpHandler(std::string msg)
// {
//     return msg;
// }

int main(int argc, char *argv[])
{
    uint16_t port = 8888; // 默认端口号

    if (argc == 2)
        port = static_cast<uint16_t>(stoi(argv[1]));

    unique_ptr<ns_httpserver::HttpServer> ptsvr(new ns_httpserver::HttpServer(HttpHandler, port));

    // 初始化服务
    ptsvr->InitServer();

    // 启动服务
    ptsvr->StartServer();

    return 0;
}